//package com.example.ezexcel;
//
//import com.alibaba.excel.EasyExcel;
//import com.alibaba.excel.context.AnalysisContext;
//import com.alibaba.excel.enums.CellExtraTypeEnum;
//import com.alibaba.excel.event.AnalysisEventListener;
//import com.alibaba.excel.metadata.CellExtra;
//import com.example.ezexcel.pojo.entity.QuestionData;
//import lombok.extern.slf4j.Slf4j;
//import org.junit.jupiter.api.Test;
//import org.springframework.boot.test.context.SpringBootTest;
//
//import java.lang.reflect.Field;
//import java.util.*;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.stream.IntStream;
//
//@Slf4j
//@SpringBootTest
//class Save {
//
//
//    @Test
//    void contextLoads() {
//
//        String fileName = "F:\\文档\\WXWork\\1688858101519141\\Cache\\File\\2023-12\\1.理论-1-用电客户受理员.xlsx"; // 替换为您的文件路径
//        List<QuestionData> questionDataList = new ArrayList<>();
//        EasyExcel.read(fileName, QuestionData.class, new AnalysisEventListener<QuestionData>() {
//
//            @Override
//            public void invoke(QuestionData data, AnalysisContext context) {
//
//
//                for (Field field : QuestionData.class.getDeclaredFields()) {
//                    field.setAccessible(true); // 确保可以访问私有字段
//                    try {
//                        if (field.get(data) instanceof String) {
//                            String value = (String) field.get(data);
//                            // 仅去除首尾空格
//                            value = value.trim();
//                            field.set(data, value);
//                        }
//                    } catch (IllegalAccessException e) {
//                        e.printStackTrace();
//                    }
//                }
//
//                log.info("处理后的数据: {}", data);
//                questionDataList.add(data);
//
//
//            }
//
//            @Override
//            public void doAfterAllAnalysed(AnalysisContext context) {
//                // 所有数据解析完成后做的事情
////                log.info("所有数据解析完成:{}", questionDataList);
//                // 所有数据解析完成后做的事情
//                Map<String, Set<String>> duplicatesMap = new ConcurrentHashMap<>();
//                Map<String, Set<String>> identicalMap100 = new ConcurrentHashMap<>(); // 100%相似度
//                Map<String, Set<String>> identicalMap90 = new ConcurrentHashMap<>(); // 90%相似度
//                Map<String, Set<String>> identicalMap80  = new ConcurrentHashMap<>();
//                Set<Integer> checkedForIdentical = ConcurrentHashMap.newKeySet(); // 用于存储已经检查过的题干索引
//
//                IntStream.range(0, questionDataList.size()).parallel().forEach(i -> {
//                    if (checkedForIdentical.contains(i)) return; // 如果这个题干已经标记为完全相同，则跳过
//
//                    QuestionData questionObjectI = questionDataList.get(i);
//                    if (questionObjectI != null) {
//                        String questionI = questionObjectI.getQuestionContent();
//                        if (questionI != null) {
//                            for (int j = i + 1; j < questionDataList.size(); j++) {
//                                if (checkedForIdentical.contains(j)) continue; // 跳过已经标记为完全相同的题干
//
//                                QuestionData questionObjectJ = questionDataList.get(j);
//                                if (questionObjectJ != null) {
//                                    String questionJ = questionObjectJ.getQuestionContent();
//                                    if (questionJ != null) {
//                                        double similarity = Levenshtein.calculateSimilarity(questionI, questionJ);
//                                        if (similarity > 80.0) {
//                                            // 如果题干完全相同
//                                            identicalMap80.computeIfAbsent(questionI, k -> ConcurrentHashMap.newKeySet())
//                                                    .add(questionObjectI.getNum());
//                                            identicalMap80.get(questionI).add(questionObjectJ.getNum());
//                                            checkedForIdentical.add(j); // 标记为已检查
//                                        } else {
//                                            // 如果题干不完全相同，进行子字符串检查
//                                            for (int k = 0; k <= questionJ.length() - 20; k++) {
//                                                String substring = questionJ.substring(k, k + 20);
//                                                duplicatesMap.compute(substring, (key, value) -> {
//                                                    if (value == null) value = ConcurrentHashMap.newKeySet();
//                                                    value.add(questionObjectJ.getNum());
//                                                    return value;
//                                                });
//                                            }
//                                        }
//                                    }
//                                }
//                            }
//                        }
//                    }
//                });
//
//                // 输出完全相同的题干的序号
//                identicalMap80.forEach((question, nums) -> {
//                    if (nums.size() > 1) {
//                        System.out.println("相似度80%题干: " + question + " 出现序号为 " + nums);
//                    }
//                });
//
//                // 输出重复子字符串的索引
//                duplicatesMap.forEach((pattern, indices) -> {
//                    if (indices.size() > 1) { // 如果存在多个索引，则表示发现了重复
//                        System.out.println("重复的子字符串: " + pattern + " 出现序号为 " + indices);
//                    }
//                });
//
//                // 打印映射表长度
//                System.out.println("identicalMap80长度为：" + identicalMap80.size());
//                System.out.println("duplicatesMap长度为：" + duplicatesMap.size());
//
//
//            }
//
//
//        }).sheet().doRead();
//    }
//
//}
